home *** CD-ROM | disk | FTP | other *** search
- package eval;
-
- import java.util.Vector;
-
- class Result {
- public static final int TYPE_ERROR = 100;
- public static final int TYPE_LONG = 1;
- public static final int TYPE_BCD = 2;
- public static final int OPER_ADD = 1;
- public static final int OPER_SUB = 2;
- public static final int OPER_MUL = 3;
- public static final int OPER_DIV = 4;
- public int type;
- // $FF: renamed from: ll long
- public long field_0;
- public MyDecimal bcd;
- private static StringBuffer strBuf;
- private static int nBuf;
- protected static Vector vars = new Vector();
-
- public Result() {
- this.type = 1;
- this.field_0 = 0L;
- }
-
- public Result(int var1, long var2, MyDecimal var4) {
- this.type = var1;
- this.field_0 = var2;
- this.bcd = var4;
- }
-
- public Result(long var1) {
- this.field_0 = var1;
- this.type = 1;
- }
-
- public Result(MyDecimal var1) {
- this.type = 2;
- this.bcd = new MyDecimal(var1);
- }
-
- public Result(Result var1) {
- this.type = var1.type;
- this.field_0 = var1.field_0;
- this.bcd = new MyDecimal(var1.bcd);
- }
-
- public Result(String var1) throws MyDecimalException {
- this.type = 2;
- this.bcd = new MyDecimal(var1);
- }
-
- public static Result Evaluate(String var0) throws BadFormulaException {
- int var2;
- if ((var2 = var0.indexOf(61)) > 0) {
- String var3 = var0.substring(0, var2);
- if (!validName(var3)) {
- throw new BadFormulaException("Invalid variable name <" + var3 + ">");
- } else {
- Result var5 = Evaluate(var0.substring(var2 + 1));
- Variable var4 = findVar(var3);
- if (var4 != null) {
- if (var4.persistent) {
- throw new BadFormulaException("System constant cannot be modified");
- }
-
- var4.val = var5;
- }
-
- addVar(new Variable(var3, var5, false));
- return var5;
- }
- } else {
- strBuf = new StringBuffer(var0);
- strBuf.append('\u0000');
- nBuf = 0;
- Result var1 = fplus();
- if (get1() != 0) {
- throw new BadFormulaException("Bad expression");
- } else {
- strBuf = null;
- return var1;
- }
- }
- }
-
- public static void addVar(Variable var0) {
- vars.addElement(var0);
- }
-
- private static Result fconst() throws BadFormulaException {
- if (isLetter(strBuf.charAt(nBuf))) {
- return ffunc();
- } else {
- String var2 = "bad formula (expected a constant)";
- StringBuffer var3 = new StringBuffer("");
-
- char var0;
- while((var0 = strBuf.charAt(nBuf++)) >= '0' && var0 <= '9' || var0 == '.') {
- var3.append(var0);
- }
-
- --nBuf;
- if (var3.length() <= 0) {
- throw new BadFormulaException(var2);
- } else {
- try {
- Result var1 = new Result(var3.toString());
- return var1;
- } catch (MyDecimalException var4) {
- throw new BadFormulaException(var2);
- }
- }
- }
- }
-
- private static Result ffunc() throws BadFormulaException {
- StringBuffer var1 = new StringBuffer("");
-
- char var0;
- while(isLetter(var0 = strBuf.charAt(nBuf++)) || isDigit(var0)) {
- var1.append(var0);
- }
-
- String var2 = var1.toString();
- if (var0 == '(') {
- Result var4 = fplus();
- if (get1() != ')') {
- throw new BadFormulaException("missing ')' in function");
- } else {
- if (var2.compareTo("sin") == 0) {
- var4.bcd = var4.bcd.sin();
- } else {
- if (var2.compareTo("cos") != 0) {
- throw new BadFormulaException("unknown function " + var2 + "()");
- }
-
- var4.bcd = var4.bcd.cos();
- }
-
- return var4;
- }
- } else {
- --nBuf;
- Variable var3 = findVar(var2);
- if (var3 == null) {
- throw new BadFormulaException("unknown variable name <" + var2 + ">");
- } else {
- return new Result(var3.val);
- }
- }
- }
-
- public static Variable findVar(String var0) {
- var0 = var0.toLowerCase();
-
- for(int var1 = 0; var1 < vars.size(); ++var1) {
- Variable var2 = (Variable)vars.elementAt(var1);
- if (var0.compareTo(var2.name) == 0) {
- return var2;
- }
- }
-
- return null;
- }
-
- private static Result fminus() throws BadFormulaException {
- if (get1() == '-') {
- Result var0 = fparent();
- if (var0.type == 2) {
- var0.bcd.reverse();
- } else if (var0.type == 1) {
- var0.field_0 = -var0.field_0;
- }
-
- return var0;
- } else {
- unget1();
- return fconst();
- }
- }
-
- private static Result fmult() throws BadFormulaException {
- Result var0;
- Result var1;
- char var2;
- for(var0 = fparent(); (var2 = get1()) == '*' || var2 == '/'; var0 = operation(var2 == '*' ? 3 : 4, var0, var1)) {
- var1 = fparent();
- }
-
- unget1();
- return var0;
- }
-
- private static Result fparent() throws BadFormulaException {
- if (get1() == '(') {
- Result var0 = fplus();
- if (get1() != ')') {
- throw new BadFormulaException("missing ')'");
- } else {
- return var0;
- }
- } else {
- unget1();
- return fminus();
- }
- }
-
- private static Result fplus() throws BadFormulaException {
- Result var0;
- Result var1;
- char var2;
- for(var0 = fmult(); (var2 = get1()) == '+' || var2 == '-'; var0 = operation(var2 == '+' ? 1 : 2, var0, var1)) {
- var1 = fmult();
- }
-
- unget1();
- return var0;
- }
-
- private static char get1() throws BadFormulaException {
- char var0;
- while((var0 = strBuf.charAt(nBuf++)) == ' ' || var0 == '\t' || var0 == '\n') {
- }
-
- return var0;
- }
-
- private static boolean isDigit(char var0) {
- return var0 >= '0' && var0 <= '9';
- }
-
- private static boolean isLetter(char var0) {
- return var0 >= 'a' && var0 <= 'z' || var0 >= 'A' && var0 <= 'Z' || var0 >= '_';
- }
-
- public static int numberOfVars(boolean var0) {
- int var1 = 0;
-
- for(int var2 = 0; var2 < vars.size(); ++var2) {
- Variable var3 = (Variable)vars.elementAt(var2);
- if (var3.persistent == var0) {
- ++var1;
- }
- }
-
- return var1;
- }
-
- public static Result operation(int var0, Result var1, Result var2) throws BadFormulaException {
- Result var3 = new Result();
- int var4 = var1.toMaxType(var2.toMaxType(var1.type));
- switch (var0) {
- case 1:
- if (var4 == 1) {
- var3.field_0 = var1.field_0 + var2.field_0;
- } else {
- var3.bcd = var1.bcd.add(var2.bcd);
- }
- break;
- case 2:
- if (var4 == 1) {
- var3.field_0 = var1.field_0 - var2.field_0;
- } else {
- var3.bcd = var1.bcd.subtract(var2.bcd);
- }
- break;
- case 3:
- if (var4 == 1) {
- var3.field_0 = var1.field_0 * var2.field_0;
- } else {
- var3.bcd = var1.bcd.multiply(var2.bcd);
- }
- break;
- case 4:
- if (var4 == 1) {
- var1.field_0 /= var2.field_0;
- } else {
- try {
- var3.bcd = var1.bcd.divide(var2.bcd);
- } catch (MyDecimalException var6) {
- throw new BadFormulaException(((Throwable)var6).getMessage());
- }
- }
- }
-
- var3.type = var4;
- return var3;
- }
-
- private int toMaxType(int var1) {
- return this.type;
- }
-
- public String toString() {
- if (this.type == 1) {
- return Long.toString(this.field_0);
- } else {
- String var1 = this.bcd.toString();
- return var1;
- }
- }
-
- private static void unget1() {
- --nBuf;
- }
-
- private static boolean validName(String var0) {
- int var2 = var0.length();
- if (var2 <= 0) {
- return false;
- } else if (!isLetter(var0.charAt(0))) {
- return false;
- } else {
- for(int var3 = 1; var3 < var2; ++var3) {
- char var1;
- if (!isLetter(var1 = var0.charAt(var3)) && !isDigit(var1)) {
- return false;
- }
- }
-
- return true;
- }
- }
- }
-